using Beauty.Net.JsonWebToken.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace Beauty.Net.JsonWebToken;

/// <summary>
/// JWT服务依赖注入扩展方法
/// </summary>
public static class JwtServiceCollectionExtensions
{
    
    /// <summary>
    /// 添加JWT服务
    /// </summary>
    /// <param name="services">服务集合</param>
    /// <param name="configureOptions">配置选项的委托</param>
    /// <returns>服务集合</returns>
    public static IServiceCollection AddJwtService(
        this IServiceCollection services,
        Action<JwtOptions> configureOptions)
    {
        if (services == null)
            throw new ArgumentNullException(nameof(services));
        
        if (configureOptions == null)
            throw new ArgumentNullException(nameof(configureOptions));
        
        // 配置JwtOptions
        services.Configure(configureOptions);
        
        // 注册JWT服务
        services.AddScoped<IJwtService, JwtService>();
        
        return services;
    }
    
    /// <summary>
    /// 添加JWT服务（使用默认配置）
    /// </summary>
    /// <param name="services">服务集合</param>
    /// <returns>服务集合</returns>
    public static IServiceCollection AddJwtService(this IServiceCollection services)
    {
        if (services == null)
            throw new ArgumentNullException(nameof(services));
        
        // 使用默认配置
        services.Configure<JwtOptions>(options =>
        {
            // 生成默认密钥（生产环境应该在配置中设置）
            options.SecretKey = GenerateDefaultSecretKey();
            options.Issuer = "Beauty.Net.JsonWebToken";
            options.Audience = "Beauty.Net.JsonWebToken";
            options.AccessTokenExpirationMinutes = 30;
            options.RefreshTokenExpirationHours = 24;
            options.ValidateToken = true;
        });
        
        // 注册JWT服务
        services.AddScoped<IJwtService, JwtService>();
        
        return services;
    }
    
    /// <summary>
    /// 生成默认密钥
    /// </summary>
    /// <returns>默认密钥</returns>
    private static string GenerateDefaultSecretKey()
    {
        // 在实际生产环境中，应该使用安全的方式生成和存储密钥
        // 这里只是为了演示和开发环境提供一个默认值
        return "ThisIsADefaultSecretKeyForDevelopmentOnly_ChangeInProduction";
    }
}